I *think* this is the action block guard construction...

REQUIRES THESE:
06D5DC 0001 82	LB	A1,0001 (S1)	//A1= body
06D664 0001 82

returns 0 if unsucessful...
7F03415C: ADDIU SP, SP, 0xFFC0
7F034160: SW RA, 0x001C (SP)
7F034164: SW A0, 0x0040 (SP)		save body
7F034168: SW A1, 0x0044 (SP)		save head
7F03416C: SW A2, 0x0048 (SP)		save preset address
7F034170: JAL 0x7F01FFC0		returns V0=next available guard ID#
7F034174: SW A3, 0x004C (SP)		save pad pointer
7F034178: SLTI AT, V0, 0x0003
7F03417C: BNEZ AT, 0x7F034244		ID should not be less than 3...
7F034180: LW V1, 0x0048 (SP)		V1=preset address
7F034184: LW T6, 0x0044 (SP)		T6=head
7F034188: BGEZL T6, 0x7F0341A4		catch random heads
7F03418C: LWC1 F4, 0x0000 (V1)		F4=x position
//
7F034190: JAL 0x7F0235AC		V0=solo random head; requires A0=body
7F034194: LW A0, 0x0040 (SP)
7F034198: LW V1, 0x0048 (SP)		V1=preset address
7F03419C: SW V0, 0x0044 (SP)		save head
7F0341A0: LWC1 F4, 0x0000 (V1)
//
7F0341A4: LW A3, 0x0058 (SP)		A3=bitflags
7F0341A8: LW T7, 0x004C (SP)		T7=pad pointer
7F0341AC: SWC1 F4, 0x0030 (SP)		save x pos
7F0341B0: LWC1 F6, 0x0004 (V1)		F6=y position
7F0341B4: ANDI T8, A3, 0x0010
7F0341B8: SLTU A3, R0, T8
7F0341BC: SWC1 F6, 0x0034 (SP)		save y pos
7F0341C0: LWC1 F8, 0x0008 (V1)		F8=z position
7F0341C4: ADDIU A0, SP, 0x0030
7F0341C8: ADDIU A1, SP, 0x0028
7F0341CC: LW A2, 0x0050 (SP)		A2=lateral rotation?
7F0341D0: SW T7, 0x0028 (SP)		save pad pointer
7F0341D4: JAL 0x7F033F48
7F0341D8: SWC1 F8, 0x0038 (SP)		save z pos
7F0341DC: BEQ V0, R0, 0x7F034244	expect a valid pointer
7F0341E0: LW A0, 0x0040 (SP)		A0=body
7F0341E4: LW A1, 0x0044 (SP)		A1=head
7F0341E8: JAL 0x7F0234D0		returns V0= pointer to model stuff?
7F0341EC: LW A2, 0x0058 (SP)		A2=bitflags
7F0341F0: BEQ V0, R0, 0x7F034244
7F0341F4: OR A0, V0, R0			A0=V0
7F0341F8: LW T0, 0x0054 (SP)		T0=pointer to action
7F0341FC: ADDIU A1, SP, 0x0030
7F034200: LW A2, 0x0050 (SP)		A2=lateral rotation?
7F034204: LW A3, 0x0028 (SP)		A3=pad pointer
7F034208: JAL 0x7F0203B8		initializes and stores values to guarddata
7F03420C: SW T0, 0x0010 (SP)
7F034210: BEQ V0, R0, 0x7F034244	test to see if valid guarddata pointer?
7F034214: OR A0, V0, R0
7F034218: JAL 0x7F03A4F0
7F03421C: SW V0, 0x003C (SP)
7F034220: JAL 0x7F03A404
7F034224: LW A0, 0x003C (SP)
7F034228: LW V0, 0x003C (SP)
7F03422C: LW T1, 0x0044 (SP)
7F034230: LW V1, 0x0004 (V0)
7F034234: SB T1, 0x0006 (V1)
7F034238: LW T2, 0x0040 (SP)
7F03423C: BEQ R0, R0, 0x7F034248
7F034240: SB T2, 0x000F (V1)
7F034244: OR V0, R0, R0
7F034248: LW RA, 0x001C (SP)
7F03424C: ADDIU SP, SP, 0x0040
7F034250: JR RA
7F034254: NOP

--------


--------
7F01FFC0:	returns V1=next available guard ID
LUI	A0,8003
LW	A0,CC68 (A0)	A0=#guards
OR	V1,R0,R0
OR	V0,R0,R0
BLEZ	A0,7F020010	
LUI	A1,8003
SLL	A2,A0,0x4
SUBU	A2,A2,A0
SLL	A2,A2,0x3
SUBU	A2,A2,A0
SLL	A2,A2,0x2	A2=#guard*1DC: A2=offset to end of list
LW	A1,CC64 (A1)	A1=guarddata pointer
//7F01FFF0:
LW	T6,001C (A1)	T6: pointer to model data
ADDIU	V0,V0,01DC
SLT	AT,V0,A2
BNEZ	T6,7F020008
NOP
ADDIU	V1,V1,0001
//7F020008:
BNEZ	AT,7F01FFF0	keep going until all current IDs are exhausted
ADDIU	A1,A1,01DC
//7F020010:
JR	RA
OR	V0,V1,R0


++++++++++++
------------
[rewrite]	I need four lines: 	68C8C
7F03415C: 27BDFFC0	ADDIU SP, SP, 0xFFC0
7F034160: AFBF001C	SW RA, 0x001C (SP)
//EDITO!
7F034164: AFA50044	SW A1, 0x0044 (SP)		save head
	04810004	BGEZ	A0,+4
7F03416C: AFA60048	SW A2, 0x0048 (SP)		save preset address
	0FC08D88	JAL	7F023590	RANDBODY
	00000000	NOP
	00022025	OR	A0,V0,R0
7F03417C: AFA40040	SW A0, 0x0040 (SP)		save body
7F034180: C4C40000	LWC1 F4, 0x0000 (A2)		F4=x position
7F034184: E7A40030	SWC1 F4, 0x0030 (SP)		save x pos
7F034188: C4C60004	LWC1 F6, 0x0004 (A2)		F6=y position
7F03418C: E7A60034	SWC1 F6, 0x0034 (SP)		save y pos
7F034190: C4C80008	LWC1 F8, 0x0008 (A2)		F8=z position
7F034194: E7A80038	SWC1 F8, 0x0038 (SP)		save z pos
7F034198: 0FC07FF0	JAL 0x7F01FFC0		returns V0=next available guard ID#
7F03419C: AFA7004C	SW A3, 0x004C (SP)		save pad pointer
7F0341A0: 28410003	SLTI AT, V0, 0x0003
7F0341A4: 142000**	**BNEZ AT, 0x7F034244		MOVE!
7F0341A8: 8FAE0044	LW T6, 0x0044 (SP)		T6=head
7F0341AC: 05C10004	*BGEZ T6, +4			catch random heads
7F0341B0: 8FA70058	LW A3, 0x0058 (SP)		A3=bitflags
//
7F0341B4: 0FC08D6B	JAL 0x7F0235AC		V0=solo random head; requires A0=body
7F0341B8: 8FA40040	LW A0, 0x0040 (SP)
-1
7F0341BC: AFA20044	SW V0, 0x0044 (SP)		save head
-1
//
-1		7F034180: LW V1, 0x0048 (SP)		V1=preset address
7F0341C0: 8FAF004C	LW T7, 0x004C (SP)		T7=pad pointer
7F0341C4: 30F80010	ANDI T8, A3, 0x0010
7F0341C8: 0018382B	SLTU A3, R0, T8
//PUSH ALL BELOW +1	0x68CF4
7F0341CC: 27A40030	ADDIU A0, SP, 0x0030
7F0341D0: 27A50028	ADDIU A1, SP, 0x0028
7F0341D4: 8FA60050	LW A2, 0x0050 (SP)		A2=lateral rotation?
7F0341D8: 0FC0CFD2	JAL 0x7F033F48
7F0341DC: AFAF0028	SW T7, 0x0028 (SP)		save pad pointer
//END OF EDIT
7F0341DC: BEQ V0, R0, 0x7F034244	expect a valid pointer
7F0341E0: LW A0, 0x0040 (SP)		A0=body
7F0341E4: LW A1, 0x0044 (SP)		A1=head
7F0341E8: JAL 0x7F0234D0		returns V0= pointer to model stuff?
7F0341EC: LW A2, 0x0058 (SP)		A2=bitflags
7F0341F0: BEQ V0, R0, 0x7F034244
7F0341F4: OR A0, V0, R0			A0=V0
7F0341F8: LW T0, 0x0054 (SP)		T0=pointer to action
7F0341FC: ADDIU A1, SP, 0x0030
7F034200: LW A2, 0x0050 (SP)		A2=lateral rotation?
7F034204: LW A3, 0x0028 (SP)		A3=pad pointer
7F034208: JAL 0x7F0203B8		initializes and stores values to guarddata
7F03420C: SW T0, 0x0010 (SP)
7F034210: BEQ V0, R0, 0x7F034244	test to see if valid guarddata pointer?
7F034214: OR A0, V0, R0
7F034218: JAL 0x7F03A4F0
7F03421C: SW V0, 0x003C (SP)
7F034220: JAL 0x7F03A404
7F034224: LW A0, 0x003C (SP)
7F034228: LW V0, 0x003C (SP)
7F03422C: LW T1, 0x0044 (SP)
7F034230: LW V1, 0x0004 (V0)
7F034234: SB T1, 0x0006 (V1)
7F034238: LW T2, 0x0040 (SP)
7F03423C: BEQ R0, R0, 0x7F034248
7F034240: SB T2, 0x000F (V1)
7F034244: OR V0, R0, R0
7F034248: LW RA, 0x001C (SP)
//switch with NULL to save a line
7F034250: JR RA
7F03424C: ADDIU SP, SP, 0x0040
-1
